home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / src / haeberli / styline / styline.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  12KB  |  531 lines

  1. /*
  2.  * Copyright 1991, 1992, 1993, 1994, Silicon Graphics, Inc.
  3.  * All Rights Reserved.
  4.  *
  5.  * This is UNPUBLISHED PROPRIETARY SOURCE CODE of Silicon Graphics, Inc.;
  6.  * the contents of this file may not be disclosed to third parties, copied or
  7.  * duplicated in any form, in whole or in part, without the prior written
  8.  * permission of Silicon Graphics, Inc.
  9.  *
  10.  * RESTRICTED RIGHTS LEGEND:
  11.  * Use, duplication or disclosure by the Government is subject to restrictions
  12.  * as set forth in subdivision (c)(1)(ii) of the Rights in Technical Data
  13.  * and Computer Software clause at DFARS 252.227-7013, and/or in similar or
  14.  * successor clauses in the FAR, DOD or NASA FAR Supplement. Unpublished -
  15.  * rights reserved under the Copyright Laws of the United States.
  16.  */
  17. /*
  18.  *    styline -
  19.  *        Spin a hidden line view of an sgo object
  20.  *
  21.  *            Paul Haeberli - 1991
  22.  */
  23. #include "stdio.h"
  24. #include "gl.h"
  25. #include "device.h"
  26. #include "sgiobj.h"
  27. #include "vect.h"
  28. #include "trilist.h"
  29. #include "resource.h"
  30. #include "showcaseui.h"
  31. #include "hideline.h"
  32.  
  33. float frand();
  34. int handleevents(long mx, long my, long dev, long val);
  35.  
  36. Button        *quitbut;
  37. Valuator    *vwobblefreq, *vwobblemag;
  38. Valuator    *vwarpfreq, *vwarpmag;
  39. Valuator    *vextend, *vhalo, *vdropout;
  40. Valuator    *vcolordelta, *vsilwidth, *vwidth;
  41. Button        *mainbed;
  42. long         conx, cony, conhi;
  43. long        xorg, yorg;
  44. float       getvalval();
  45. sgiobj         *obj;
  46. float         tmat[4][4];
  47. int         dohide = 1;
  48.  
  49. #define DRAW_BACK    1
  50. #define DRAW_SLIDERS    2
  51. #define DRAW_OBJ    4
  52.  
  53. vect dropdir;
  54.  
  55. main(argc, argv)
  56. int argc;
  57. char **argv;
  58. {
  59.     long    dev, mx, my, xsize, ysize;
  60.     short    val, smx, smy;
  61.     FILE     *inf;
  62.  
  63.     if(argc<2) {
  64.     inf = res_fopen("#t.mesh");
  65.     if(inf) {
  66.         res_fclose(inf);
  67.         obj = readsgiobj("#t.mesh");
  68.     } else {
  69.         fprintf(stderr,"usage: stlye obj.sgo\n");
  70.         exit(1);
  71.     }
  72.     } else {
  73.     obj = readsgiobj(argv[1]);
  74.     }
  75. #ifdef DODROP
  76.     dropdir.x = 0.0;
  77.     dropdir.y = 1.0;
  78.     dropdir.z = 0.0;
  79.     hiddendirdrop(&dropdir,0.95);
  80. #endif
  81.     initialize(argv[1]);
  82.     activate();
  83.     gettracktransform(tmat);
  84.     drawscene(DRAW_BACK|DRAW_SLIDERS|DRAW_OBJ);
  85.     
  86.     while (1) {
  87.     switch (dev = qread(&val)) {
  88.         case F1KEY:
  89.         if(val) {
  90.             dohide = 1-dohide;
  91.             drawscene(DRAW_OBJ);
  92.         }
  93.         break;
  94.         case SKEY:
  95.         if(val) {
  96.             savewindow("save.rgb");
  97.             printf("image saved to save.rgb\n");
  98.         }
  99.         break;
  100.         case LEFTMOUSE:
  101.         qread(&smx); qread(&smy);
  102.         mx = smx - xorg;
  103.         my = smy - yorg;
  104.         if (val == UIBUTTONDOWN) {
  105.             sginap(8);
  106.             if (qtest() == dev) {
  107.             short tmp;
  108.             qread(&tmp); qread(&tmp); qread(&tmp);
  109.             val = UIBUTTONCLICK;
  110.             }
  111.         }
  112.         if (handleevents(mx, my, dev, val))
  113.             drawscene(DRAW_OBJ);
  114.         break;
  115.         case MIDDLEMOUSE:
  116.         if(val) {
  117.             trackclick();
  118.             while ((getbutton(MIDDLEMOUSE))) {
  119.             trackpoll();
  120.             gettracktransform(tmat);
  121.             drawscene(DRAW_OBJ);
  122.                   }
  123.         }
  124.         break;
  125.         case MOUSEX:
  126.         mx = val - xorg;
  127.         break;
  128.         case MOUSEY:
  129.         my = val - yorg;
  130.         locatemouseevents(mx,my);
  131.         break;
  132.         case REDRAW:
  133.         getorigin(&xorg,&yorg);
  134.         drawscene(DRAW_BACK|DRAW_SLIDERS|DRAW_OBJ);
  135.         break;
  136.     }
  137.     }
  138. }
  139.  
  140. initialize(iname)
  141. char *iname;
  142. {
  143.     long xsize, ysize;
  144.     long tmp, ymax;
  145.  
  146.     xsize = 700;
  147.     ysize = 650;
  148.  
  149.     conx = 30;
  150.     cony = 30;
  151.     conhi = 130;
  152.  
  153.     ymax = 300;
  154.     quitbut = newpushbut(xsize-10-75,10);
  155.  
  156.     vwobblefreq = newval(conx+0,cony,cony+conhi,0,15,0);
  157.     vwobblemag  = newval(conx+40,cony,cony+conhi,0,15,0);
  158.  
  159.     vwarpfreq   = newval(conx+100,cony,cony+conhi,0,15,0);
  160.     vwarpmag    = newval(conx+140,cony,cony+conhi,0,15,0);
  161.  
  162.     vextend     = newval(conx+200,cony,cony+conhi,0,15,0);
  163.     vhalo       = newval(conx+250,cony,cony+conhi,0,15,0);
  164.     vdropout    = newval(conx+300,cony,cony+conhi,0,15,0);
  165.     vcolordelta = newval(conx+350,cony,cony+conhi,0,15,0);
  166.  
  167.     vsilwidth   = newval(conx+410,cony,cony+conhi,0,15,0);
  168.     vwidth      = newval(conx+450,cony,cony+conhi,0,15,0);
  169.  
  170.     setvalval(vwobblefreq,0.6);
  171.     setvalval(vwobblemag,0.0);
  172.     setvalval(vwarpfreq,0.5);
  173.     setvalval(vwarpmag,0.0);
  174.     setvalval(vextend,0.0);
  175.     setvalval(vhalo,0.2);
  176.     setvalval(vdropout,0.0);
  177.     setvalval(vcolordelta,0.05);
  178.     setvalval(vsilwidth,0.0);
  179.     setvalval(vwidth,0.0);
  180.  
  181.     mainbed = newbed(10,cony+conhi+30,xsize-10,ysize-10);
  182.  
  183.     prefsize(xsize,ysize);
  184.     minsize(xsize,ysize);
  185.     maxsize(xsize,ysize);
  186.     winopen("Line Style Explorer");
  187.     getorigin(&xorg,&yorg);
  188.     doublebuffer();
  189.     RGBmode();
  190.     gconfig();
  191.     backbuffer(1);
  192.     frontbuffer(1);
  193.     cpack(0xe0e0e0);
  194.     clear();
  195. }
  196.  
  197. activate()
  198. {
  199.     initbut();
  200.     inittb();
  201.  
  202.     qdevice(LEFTMOUSE);
  203.     qdevice(MIDDLEMOUSE);
  204.     qdevice(UPARROWKEY);
  205.     qdevice(MOUSEX);
  206.     qdevice(MOUSEY);
  207.     qdevice(SKEY);
  208.     qdevice(F1KEY);
  209.     tie(LEFTMOUSE, MOUSEX, MOUSEY);
  210.     loadbut(quitbut,"Quit");
  211.     enableval(vwobblefreq);
  212.     enableval(vwobblemag);
  213.     enableval(vwarpfreq);
  214.     enableval(vwarpmag);
  215.     enableval(vextend);
  216.     enableval(vhalo);
  217.     enableval(vdropout);
  218.     enableval(vcolordelta);
  219.     enableval(vsilwidth);
  220.     enableval(vwidth);
  221. }
  222.  
  223. int followtrack(long mx,long my,Button *area)
  224. {
  225.     trackclick();
  226.     while ((getbutton(LEFTMOUSE))) {
  227.     trackpoll();
  228.     gettracktransform(tmat);
  229.     drawscene(DRAW_OBJ);
  230.     }
  231.     return 0;
  232. }
  233.  
  234. int followslider(long val, long my, Valuator *slider)
  235. {
  236.     int oy;
  237.  
  238.     oy = -1000;
  239.     if (val == UIBUTTONUP) return 0;
  240.     handleval(slider, LEFTMOUSE, val);
  241.     handleval(slider, MOUSEY, my+yorg);
  242.     while ((getbutton(LEFTMOUSE)) || (val == UIBUTTONCLICK)) {
  243.     my = getvaluator(MOUSEY);
  244.     if(my != oy) {
  245.         oy = my;
  246.         handleval(slider, MOUSEY, my);
  247.         drawval(slider);
  248.         val = UIBUTTONUP;
  249.     }
  250.     }
  251.     handleval(slider, LEFTMOUSE, val);
  252.     drawval(slider);
  253.     return 1;
  254. }
  255.  
  256. int handleevents(long mx, long my, long dev, long val)
  257. {
  258.     frontbuffer(1);
  259.     backbuffer(1);
  260.     if (selectedpressbut(quitbut,mx,my,val)) {
  261.     exit(0);
  262.     } else if (inval(vwobblefreq,mx,my)) {
  263.     return followslider(val,my,vwobblefreq);
  264.     } else if (inval(vwobblemag,mx,my)) {
  265.     return followslider(val,my,vwobblemag);
  266.     } else if (inval(vwarpfreq,mx,my)) {
  267.     return followslider(val,my,vwarpfreq);
  268.     } else if (inval(vwarpmag,mx,my)) {
  269.     return followslider(val,my,vwarpmag);
  270.     } else if (inval(vextend,mx,my)) {
  271.     return followslider(val,my,vextend);
  272.     } else if (inval(vhalo,mx,my)) {
  273.     return followslider(val,my,vhalo);
  274.     } else if (inval(vdropout,mx,my)) {
  275.     return followslider(val,my,vdropout);
  276.     } else if (inval(vcolordelta,mx,my)) {
  277.     return followslider(val,my,vcolordelta);
  278.     } else if (inval(vsilwidth,mx,my)) {
  279.     return followslider(val,my,vsilwidth);
  280.     } else if (inval(vwidth,mx,my)) {
  281.     return followslider(val,my,vwidth);
  282.     } else if (inbut(mainbed,mx,my)) {
  283.     return followtrack(mx,my,mainbed);
  284.     } else
  285.     return 0;
  286. }
  287.  
  288. drawscene(how)
  289. int how;
  290. {
  291.     int labely;
  292.     long xsize, ysize;
  293.     float dx, dy, mag, freq, seglen, f;
  294.  
  295.     backbuffer(1);
  296.     frontbuffer(1);
  297.     if(how & DRAW_BACK) {
  298.     cpack(0xd5d5d5);
  299.     clear();
  300.     labely = cony+conhi+10;
  301.     drawboldlabel("Wobble",conx+0+5,labely);
  302.     drawboldlabel("Freq",conx+0-5,12);
  303.     drawboldlabel("Mag",conx+40-3,12);
  304.     drawboldlabel("Warp",conx+100+10,labely);
  305.     drawboldlabel("Freq",conx+100-5,12);
  306.     drawboldlabel("Mag",conx+140-3,12);
  307.     drawboldlabel("Extend",conx+200-12,labely);
  308.     drawboldlabel("Halo",conx+250-5,labely);
  309.     drawboldlabel("Gaps",conx+300-8,labely);
  310.     drawboldlabel("Thresh",conx+350-12,labely);
  311.     drawboldlabel("Linewidths",conx+410-5,labely);
  312.     drawboldlabel("Edge",conx+410-5,12);
  313.     drawboldlabel("Inside",conx+450-3,12);
  314.     }
  315.     if(how & DRAW_SLIDERS) {
  316.     drawbut(quitbut);
  317.     drawval(vwobblefreq);
  318.     drawval(vwobblemag);
  319.     drawval(vwarpfreq);
  320.     drawval(vwarpmag);
  321.     drawval(vextend);
  322.     drawval(vhalo);
  323.     drawval(vdropout);
  324.     drawval(vcolordelta);
  325.     drawval(vsilwidth);
  326.     drawval(vwidth);
  327.     }
  328.     if(how & DRAW_OBJ) {
  329.     percentdone(50.0);
  330.     freq = 0.01+50.0*getvalval(vwobblefreq);
  331.     mag = 0.05*getvalval(vwobblemag);
  332.     seglen = 1.0/freq;
  333.     handsetwobble(freq,mag);        
  334.     freq = 0.01+1.0*getvalval(vwarpfreq);
  335.     mag = 0.5*getvalval(vwarpmag);
  336.     if((1.0/freq)<seglen)
  337.         seglen = 1.0/freq;
  338.     handsetwarp(freq,mag);        
  339.     handsetseglen(seglen/2.0);
  340.     f = 0.15*getvalval(vextend);
  341.     hiddenextend(f,f,0.5);
  342.     f = 0.15*getvalval(vhalo);
  343.     hiddenhalowidth(f);
  344.     f = getvalval(vdropout);
  345.     handsetdropout(f);
  346.     f = getvalval(vcolordelta);
  347.     hiddencolorthresh(f);
  348.     f = 0.025*getvalval(vsilwidth);
  349.     hiddensilwidth(f,f/2.0);
  350.     f = 0.025*getvalval(vwidth);
  351.     hiddenfacewidths(f,f,f);
  352.  
  353.     drawborder(mainbed);
  354.     dx = mainbed->xmax-mainbed->xmin;
  355.     dy = mainbed->ymax-mainbed->ymin;
  356.     viewport(mainbed->xmin+2,mainbed->xmax-2,mainbed->ymin+2,mainbed->ymax-2);
  357.     backbuffer(1);
  358.     frontbuffer(0);
  359.     drawit(obj,dx/dy);
  360.     swapbuffers();
  361.     mmode(MSINGLE);
  362.     getsize(&xsize,&ysize);
  363.     viewport(0,xsize-1,0,ysize-1);
  364.     ortho2(-0.5,xsize-0.5,-0.5,ysize-0.5);
  365.     linewidth(1);
  366.     percentdone(100.0);
  367.     }
  368. }
  369.  
  370. long lastmx, lastmy;
  371.  
  372. locatemouseevents(long mx, long my)
  373. {
  374.     if ((mx == lastmx) && (my == lastmy)) 
  375.     return;
  376.     lastmx = mx;
  377.     lastmy = my;
  378.     locatebut(quitbut,mx,my);
  379.     locateval(vwobblefreq,mx,my);
  380.     locateval(vwobblemag,mx,my);
  381.     locateval(vwarpfreq,mx,my);
  382.     locateval(vwarpmag,mx,my);
  383.     locateval(vextend,mx,my);
  384.     locateval(vhalo,mx,my);
  385.     locateval(vdropout,mx,my);
  386.     locateval(vcolordelta,mx,my);
  387.     locateval(vsilwidth,mx,my);
  388.     locateval(vwidth,mx,my);
  389. }
  390.  
  391. float myw;
  392.  
  393. /* 
  394.  *    GL output funcs 
  395.  *
  396.  */
  397. int widthline(w)
  398. float w;
  399. {
  400.     myw = w;
  401. }
  402.  
  403. int drawline(p0,p1)
  404. vect *p0, *p1;
  405. {
  406.     int iw;
  407.  
  408.     iw = myw*400.0+frand();
  409.     if(iw<1)
  410.        iw = 1;
  411.     linewidth(iw);
  412.     bgnline();
  413.     v2f((float*)p0);
  414.     v2f((float*)p1);
  415.     endline();
  416. }
  417.  
  418. drawit(obj,aspect)
  419. sgiobj *obj;
  420. float aspect;
  421. {
  422.     matinit();
  423.     renderperspective(250,aspect,0.3,20.0); 
  424.  
  425.     translate(0.0,0.0,-3.0);
  426.     multmatrix(tmat);
  427.  
  428.     cpack(0xa0b1bc);
  429.     clear();
  430.  
  431.     if(dohide) {
  432.     beginhideline(drawline,widthline);
  433.     projectsgiobj(obj); 
  434.     mmode(MSINGLE);
  435.     ortho2(-ASPECT,ASPECT,-1.0,1.0);
  436.     cpack(0x000000);
  437.     endhideline();
  438.     } else {
  439.     cpack(0x000000);
  440.     drawsgiobj(obj,DRAW_LINES); 
  441.     }
  442. }
  443.  
  444. #define TRITOL    (0.0000000001)
  445. static float *psprojmat;
  446.  
  447. static myttoc(t,c)
  448. vect *t, *c;
  449. {
  450.     float dx, dy, val, r;
  451.  
  452.     dx = t->x-0.5;
  453.     dy = t->y-0.75;
  454.     r = sqrt(dx*dx+dy*dy);
  455.     val = 1.0-2*r;
  456.     if(val<0.0)
  457.        val = 0.0;
  458.     c->x = val;
  459.     c->y = val;
  460.     c->z = val;
  461. }
  462.  
  463. static pstrifunc(p0,p1,p2)
  464. long *p0, *p1, *p2;
  465. {
  466.     vect tp0, tp1, tp2, n;
  467.     vect pj0, pj1, pj2, pn;
  468.     vect t, c0, c1, c2;
  469.     tile atile;
  470.  
  471.     xformvert4(psprojmat,p0+OFFSET_POINT,&tp0);
  472.     xformvert4(psprojmat,p1+OFFSET_POINT,&tp1);
  473.     xformvert4(psprojmat,p2+OFFSET_POINT,&tp2);
  474.     if(trinormal(&tp0,&tp1,&tp2,&n,TRITOL)) {
  475.     pj0.x = tp0.x/tp0.w;
  476.     pj0.y = tp0.y/tp0.w;
  477.     pj0.z = tp0.z/tp0.w;
  478.     pj1.x = tp1.x/tp1.w;
  479.     pj1.y = tp1.y/tp1.w;
  480.     pj1.z = tp1.z/tp1.w;
  481.     pj2.x = tp2.x/tp2.w;
  482.     pj2.y = tp2.y/tp2.w;
  483.     pj2.z = tp2.z/tp2.w;
  484.     if(trinormal(&pj0,&pj1,&pj2,&pn,TRITOL) && pn.z>0.0) {
  485.         tenv(p0+OFFSET_NORMAL,p0+OFFSET_POINT,&t);
  486.         myttoc(&t,&c0);
  487.         tenv(p1+OFFSET_NORMAL,p1+OFFSET_POINT,&t);
  488.         myttoc(&t,&c1);
  489.         tenv(p2+OFFSET_NORMAL,p2+OFFSET_POINT,&t);
  490.         myttoc(&t,&c2);
  491.  
  492.         c0.w = 1.0;
  493.         c1.w = 1.0;
  494.         c2.w = 1.0;
  495.  
  496.         atile.pos[0].x = ASPECT*pj0.x;
  497.         atile.pos[0].y = pj0.y;
  498.         atile.pos[0].z = -pj0.z;
  499.         atile.pos[1].x = ASPECT*pj1.x;
  500.         atile.pos[1].y = pj1.y;
  501.         atile.pos[1].z = -pj1.z;
  502.         atile.pos[2].x = ASPECT*pj2.x;
  503.         atile.pos[2].y = pj2.y;
  504.         atile.pos[2].z = -pj2.z;
  505.         atile.col[0] = tocpack(&c0);
  506.         atile.col[1] = tocpack(&c1);
  507.         atile.col[2] = tocpack(&c2);
  508.         hiddentri(&atile);
  509.     }
  510.     }
  511. }
  512.  
  513. projectsgiobj(obj)
  514. sgiobj *obj;
  515. {
  516.     float projmat[4][4];
  517.     float viewmat[4][4];
  518.     float psmat[4][4];
  519.     short magic;
  520.  
  521.     mmode(MPROJECTION);
  522.     getmatrix(projmat);
  523.     mmode(MVIEWING);
  524.     getmatrix(viewmat);
  525.  
  526.     matrixmult(projmat,viewmat,psmat);
  527.     psprojmat = &psmat[0][0];
  528.     tenvmat(viewmat);
  529.     applytotris(obj,pstrifunc);
  530. }
  531.